/*
 * @Author: 0x9DEFA478
 * @Date: 2025-10-05 19:03:08
 * @LastEditTime: 2025-10-05 19:03:08
 * @LastEditors: 0x9DEFA478
 * @Description: 为自定义WINUSB读写提供支持, 支持多个端点, 但是不支持关联多接口与接口复用设置, 仅支持bulk传输, 固定使用功能的第一个接口与复用设置0
 * 
 */
#ifndef hSystemAPI_Windows_Device_WINUSB_HPP_
#define hSystemAPI_Windows_Device_WINUSB_HPP_
#if defined(_WIN32)
#include <string>
#include <list>
#include "../../H_Type.hpp"
#endif


namespace SystemAPI{

  namespace Windows{

#if defined(_WIN32)
    class Device_WINUSB{

      public:
        Device_WINUSB();
        Device_WINUSB(const std::string& Path);
        ~Device_WINUSB()noexcept;

        Device_WINUSB(const Device_WINUSB&)=delete;
        Device_WINUSB(Device_WINUSB&& device_winusb)noexcept;

        Device_WINUSB& operator=(const Device_WINUSB&)=delete;
        Device_WINUSB& operator=(Device_WINUSB&& device_winusb)noexcept;

        std::string Path()const noexcept{return path;}
        int InputMaxPacketSize(H::byte Index)const noexcept;
        int OutputMaxPacketSize(H::byte Index)const noexcept;

        void Open(bool InfoMode);
        void Close()noexcept;

        //返回 -2:被终止 -1:超时 0:连接断开 大于0:读取到的数据长度 异常:错误信息
        int Read(H::byte Index,void* Buffer,int BufferSize,int Timeout);

        //返回 -2:被终止 -1:超时 0:连接断开 大于0:读取到的数据长度 异常:错误信息
        int Write(H::byte Index,const void* Data,int DataLength,int Timeout);

        static std::list<std::string> FindDeviceList(const std::string& GUID);

      private:
        std::string path;
        void* privateData;
    };
#endif

  }
}


#endif //hSystemAPI_Windows_Device_WINUSB_HPP_
